from marshmallow import Schema
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema


def auto_model_jsonify(data, model):
    """
    自动序列化模型数据为 JSON 格式，支持单个对象和对象列表。

    示例：
        # 序列化单个对象
        user_info = auto_model_jsonify(model=User, data=user)

        # 序列化对象列表
        users_info = auto_model_jsonify(model=User, data=users)

    :param data: 需要序列化的 SQLAlchemy 查询结果（单个对象或对象列表）。
    :param model: SQLAlchemy 模型类。
    :return: 返回序列化后的 JSON 数据。
    """

    def get_model():
        return model

    class AutoSchema(SQLAlchemyAutoSchema):
        class Meta(Schema):
            model = get_model()
            include_fk = True  # 包含外键
            include_relationships = True  # 包含关联关系
            load_instance = True  # 反序列化时加载为模型实例

    # 检查data是否为列表或查询结果集
    if hasattr(data, '__iter__') and not isinstance(data, (str, bytes)):
        # 如果是可迭代对象（列表、查询结果集等）
        common_schema = AutoSchema(many=True)
    else:
        # 如果是单个对象
        common_schema = AutoSchema(many=False)
    output = common_schema.dump(data)

    return output


from flask import jsonify, request


def success_api(msg: str = "成功"):
    """
    返回成功的 API 响应。

    :param msg: 成功消息内容，默认为 "成功"。
    :return: 返回 JSON 格式的响应，包含 `success` 和 `msg` 字段。
    """
    return jsonify(success=True, msg=msg)


def fail_api(msg: str = "失败"):
    """
    返回失败的 API 响应。

    :param msg: 失败消息内容，默认为 "失败"。
    :return: 返回 JSON 格式的响应，包含 `success` 和 `msg` 字段。
    """
    return jsonify(success=False, msg=msg)


def table_api(msg: str = "", count=0, data=None, limit=10):
    """
    返回动态表格渲染所需的 API 响应。

    :param msg: 响应消息内容，默认为空字符串。
    :param count: 数据总数，默认为 0。
    :param data: 表格数据，默认为 None。
    :param limit: 每页数据条数，默认为 10。
    :return: 返回 JSON 格式的响应，包含 `msg`、`code`、`data`、`count` 和 `limit` 字段。
    """
    res = {
        'msg': msg,
        'code': 0,
        'data': data,
        'count': count,
        'limit': min(request.args.get('limit', default=10, type=int), 90)
    }
    return jsonify(res)
